home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / prolog / dokument / document.doc < prev   
Encoding:
Text File  |  1994-09-22  |  74.1 KB  |  1,906 lines

  1.  
  2.  
  3.                TOY Prolog ST
  4.  
  5.           Dokumentation für Version 3
  6.  
  7.      Inhalt
  8.  
  9. I.   Urheberrechte
  10. II.  Syntax und Benutzerschnittstelle
  11. III. Systemfunktionen und vordefinierte Prädikate
  12. IV.  Die Hilfsprogramme
  13. V.   Die Demonstrationsprogramme
  14.  
  15.      Anhang
  16.  
  17. A.1  Aufbau des Interpreters
  18. A.2  Syntax des inneren Interpreters
  19. A.3  Die Systemdatei
  20. A.4  Die Implementierung der Benutzerschnittstelle
  21. A.5  Unterschiede der vorliegenden Version zur Dokumentation
  22.  
  23.      I. Urheberrechte
  24.  
  25. Das Programm basiert auf einer Implementierung von Prolog, die von 
  26. Feliks Kluzniak und Stanislaw Szpakowicz in ihrem Buch "Prolog for 
  27. Programmers" (Academic Press, London, 1985) veröffentlicht wurde.
  28.  
  29. Die Rechte für die ATARI-Version liegen bei Jens Kilian, Bensheim.
  30.  
  31.  
  32. Das Programm ist unter der Bedingung,  daß keiner der Hinweise auf 
  33. die  bestehenden  Urheberrechte  aus  den  verschiedenen   Dateien 
  34. entfernt   oder  verändert  wird,   freigegeben  zur  öffentlichen 
  35. Verbreitung, jedoch darf es nicht gewinnbringend verkauft werden.
  36.  
  37.  
  38.  
  39. ATARI,   520  ST  und  TOS  sind  Warenzeichen der ATARI Corp.
  40.  
  41. GEM ist Warenzeichen von Digital Research, Inc.
  42.  
  43.  
  44.      II. Syntax und Benutzerschnittstelle
  45.  
  46. Der verwendete Dialekt ähnelt stark dem in "Programming in Prolog" 
  47. (Clocksin/Mellish,  Springer-Verlag,  Berlin  und Heidelberg 1981) 
  48. verwendeten  Dialekt  Prolog-10.  Einige der  Unterschiede  werden 
  49. weiter unten mit angegeben.
  50.  
  51.  
  52.  
  53.      II.1 Syntax von TOY Prolog
  54.  
  55. Die  verwendete  Notation  ist  BNF,  wobei  die  nicht-terminalen 
  56. Symbole  fett  dargestellt  sind;  einige davon sind  mit  Indizes 
  57. versehen.  Der Konstrukt  {  s  }  bedeutet, daß die Symbolfolge s 
  58. beliebig oft (auch 0 mal) wiederholt werden kann.
  59. Um Verwechselungen vorzubeugen,  sind die terminalen Symbole {, |, 
  60. } ebenfalls fett dargestellt.
  61.  
  62. Es  wird  angenommen,  daß die normalen Operatorvereinbarungen  in 
  63. Kraft sind.
  64.  
  65. Kommentare sind durch *** angegeben.
  66.  
  67. Klausel             ::= Definition | Grammatische_Regel | Direktive
  68. Definition          ::= Regel | Fakt
  69. Regel               ::= Kopf :- Rumpf
  70. Fakt                ::= Kopf
  71. *** Der äußerste Funktor von Kopf ist nicht :- / 2
  72. Kopf                ::= Funktor_Term
  73. Rumpf               ::= Rumpf_Alternative { ; Rumpf_Alternative }
  74. Rumpf_Alternative   ::= Aufruf { , Aufruf }
  75. Aufruf              ::= Funktor_Term | Variable | ( Rumpf )
  76. Funktor_Term        ::= Term
  77. *** Keine Variable und kein Integer; eine formale Definition 
  78. *** wäre ziemlich aufwendig
  79. Grammatische_Regel  ::= Linke_Seite --> Rechte_Seite
  80. Linke_Seite         ::= Nicht_terminal Kontext | Nicht_terminal
  81. Nicht_terminal      ::= Funktor_Term
  82. Kontext             ::= terminale_Symbole
  83. Rechte_Seite        ::= Alternativen
  84. Alternativen        ::= Alternative { ; Alternative }
  85. Alternative         ::= Regel_Element { , Regel_Element }
  86. Regel_Element       ::= Nicht_terminal | terminale_Symbole |
  87.                         Bedingung | ! | ( Alternativen )
  88. terminale_Symbole   ::= Liste | Zeichenkette
  89. *** Nur 'geschlossene' Listen sind erlaubt
  90. Bedingung           ::= Klammer_Term
  91. Direktive           ::= Kommando | Anfrage
  92. Kommando            ::= :- Rumpf
  93. Anfrage             ::= Rumpf
  94. *** Der äußerste Funktor von Rumpf ist nicht :- / 1
  95.  
  96. Term                ::= Term1200
  97. TermN               ::= Opfx,N TermN-1 | Opfy,N TermN |
  98.                         TermN-1 Opxf,N | TermN Opyf,N |
  99.                         TermN-1 Opxfx,N TermN-1 |
  100.                         TermN-1 Opxfy,N TermN   |
  101.                         TermN   Opyfx,N TermN-1 |
  102.                         TermN   Opyfy,N TermN   | TermN-1
  103. *** 1 ≤ N ≤ 1200; OpTyp,N ist ein Operator mit Typ 'Typ' und
  104. *** Priorität N; TermN kann man 'Term mit Priorität N' nennen.
  105. Term0               ::= Variable | Integer | Zeichenkette |
  106.                         Liste | Nicht_Operator | 
  107.                         Nicht_Operator ( Term { , Term } ) |
  108.                         ( Term ) | Klammer_Term
  109. Klammer_Term        ::= { Term }
  110. Nicht_Operator      ::= Funktor
  111. OpT,N               ::= Funktor
  112. *** T ∈ { fx, fy, xf, yf, xfx, xfy, yfx, yfy }, 1 ≤ N ≤ 1200
  113. *** siehe auch Bemerkung 1
  114. Liste               ::= [] | [ Term999 { , Term999 } ] |
  115.                         [ Term999 { , Term999 } | Term ]
  116. *** Terme mit Priorität 999 können ohne Klammern mit Kommas
  117. *** verbunden werden ( , / 2 hat Priorität 1000)
  118. Funktor             ::= Wort | Q_Name | Symbol | Einzelzeichen
  119. Wort                ::= Wortanfang { Alphanum }
  120. Wortanfang          ::= Kleinbuchstabe
  121. Alphanum            ::= Kleinbuchstabe | Großbuchstabe | 
  122.                         Ziffer | _
  123. Q_Name              ::= ' { Q_Zeichen } '
  124. Q_Zeichen           ::= '' | Nicht_'
  125. *** Nicht_' ist ein beliebiges Zeichen außer '
  126. Symbol              ::= Symbolzeichen { Symbolzeichen }
  127. Variable            ::= Variablenanfang { Alphanum }
  128. Variablenanfang     ::= Großbuchstabe | _
  129. Integer             ::= - Ziffer { Ziffer } | Ziffer { Ziffer }
  130. Zeichenkette        ::= " { S_Zeichen } "
  131. *** In TOY bedeutet eine Zeichenkette eine Liste aus den Namen
  132. *** der Zeichen, in Prolog-10 eine Liste ihrer ASCII-Codes
  133. S_Zeichen           ::= "" | Nicht_"
  134. *** Nicht_" ist ein beliebiges Zeichen außer "
  135. Kleinbuchstabe      ::= a | b | c | d | e | f | g | h | i |
  136.                         j | k | l | m | n | o | p | q | r |
  137.                         s | t | u | v | w | x | y | z | ü |
  138.                         é | â | ä | à | å | ç | ê | ë | è |
  139.                         ï | î | ì | æ | ô | ö | ò | û | ù |
  140.                         ÿ | ß | ƒ | á | í | ó | ú | ñ | ª |
  141.                         º | ã | õ | ø | œ | ij
  142. Großbuchstabe       ::= A | B | C | D | E | F | G | H | I |
  143.                         J | K | L | M | N | O | P | Q | R |
  144.                         S | T | U | V | W | X | Y | Z | Ç |
  145.                         Ä | Å | É | Æ | Ö | Ü | Ñ | Ø | Œ |
  146.                         À | Ã | Õ | IJ
  147. Ziffer              ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  148. Symbolzeichen       ::= # | $ | & | * | + | - | . | / | : |
  149.                         < | = | > | ? | @ | \ | ^ | ` | ~ |
  150.                          | ¢ | £ | ¥ | ¿ | ⌐ | ¬ | ¡ | « |
  151.                         » | § | ∧ | ∞ | ≡ | ± | ≥ | ≤ | ÷ |
  152.                         ≈ | ¯
  153. *** Ein einzelner Punkt, gefolgt von Leerraum,
  154. *** ist kein Symbolzeichen, sondern ein Ende_Punkt.
  155. Einzelzeichen       ::= , | ; | !
  156. Zeichengruppe       ::= Funktor | Variable | Integer |
  157.                         Zeichenkette | Klammer_oder_Strich
  158. *** Zeichengruppen werden in Bemerkung 6 verwendet, s.u.
  159. Klammer_oder_Strich ::= ( | ) | [ | ] | { | } | |
  160. Kommentar           ::= % { Nicht_Zeilenende } Zeilenende
  161. *** Zeilenende ist ein Zeichen, das das Ende einer Zeile angibt,
  162. *** Nicht_Zeilenende ist ein beliebiges anderes Zeichen.
  163. *** TOY Prolog wandelt alle Zeilenenden in einzelne CR-Zeichen um.
  164. Leerraum            ::= { Kontrollzeichen }
  165. *** Kontrollzeichen ist 'SPACE' oder 'TAB' oder Zeilenende oder
  166. *** ein beliebiges nichtdruckbares Zeichen (ASCII-Code < 32).
  167. Ende_Punkt          ::= . Kontrollzeichen
  168.  
  169. Bemerkungen:
  170. (1)  Gemischte  Operatoren  wurden nicht in die  Beschreibung  mit 
  171.      aufgenommen,  aber  die Regeln dafür haben alle dieselbe Form 
  172.      wie z.B.
  173.  
  174.      TermN               ::= Op[xfy,fx],N TermN-1
  175.  
  176.      (es gibt noch 11 weitere Regeln für gemischte Operatoren).
  177.  
  178.      In  TOY Prolog kann ein gemischter Operator  höchstens  einen 
  179.      unären  und einen binären Typ besitzen,  beide mit  derselben 
  180.      Priorität.
  181.  
  182. (2)  Es gibt viele mehrdeutige Kombinationen von zusammenhängenden 
  183.      Operatoren, die nicht von dieser Beschreibung erfaßt werden.
  184.  
  185. (3)  Nicht  alle Funktoren (z.B.  Namen in Apostrophen) können als 
  186.      Operatoren vereinbart werden.
  187.  
  188. (4)  In  der  Beschreibung  von Rumpf  hätte  man  die  gesonderte 
  189.      Betrachtung  von , / 2 und ; / 2 weglassen können,  da  beide 
  190.      normalerweise als Infix-Operatoren vereinbart sind. Die Regel
  191.  
  192.      Rumpf ::= Funktor_Term
  193.  
  194.      hätte  aber  die  im  Regelfall  auftretende  Struktur  eines 
  195.      Rumpfes verschleiert.
  196.  
  197. (5)  Die Syntax für Direktiven (Kommandos und Anfragen) orientiert 
  198.      sich an der in TOY Prolog verwendeten Benutzerschnittstelle.
  199.  
  200. (6)  Kommentare  und  Leerraum  können  beliebig  vor  und  hinter 
  201.      Zeichengruppen  eingesetzt  werden,  nicht jedoch  im  Innern 
  202.      einer Zeichengruppe. Ein Kommentar erstreckt sich nur bis zum 
  203.      nächsten Zeilenende.
  204.  
  205. (7)  Zwischen einem Minuszeichen, das als Funktor behandelt werden 
  206.      soll,  und einer vorzeichenlosen Integerzahl muß ein Leerraum 
  207.      stehen.  Ein  Minuszeichen direkt vor einer Ziffernfolge wird 
  208.      als Vorzeichen betrachtet.
  209.  
  210. (8)  Ein  eingegebener  Term muß mit einem  Ende_Punkt  (außerhalb 
  211.      eines apostrophiertens Namens,  einer Zeichenkette oder eines 
  212.      Kommentares) abgeschlossen werden
  213.  
  214. (9)  TOY  Prolog benutzt einen  einfachen  Unifikationsalgorithmus 
  215.      ohne 'occurrence check'. Daher können z.B. die Terme 
  216.  
  217.           X         und            f(X)
  218.  
  219.      unifiziert werden. Dabei entstehen zyklische Datenstrukturen, 
  220.      die bei unvorsichtiger Programmierung den Interpreter bei der 
  221.      Ausgabe  oder der Unifikation in eine  Endlosschleife  führen 
  222.      können. Bei solchen Strukturen ist daher Vorsicht geboten.
  223.  
  224.  
  225.      II.2 Die Benutzerschnittstelle
  226.  
  227. Die  Benutzerschnittstelle  von TOY Prolog ist  in  Prolog  selbst 
  228. geschrieben.  Dabei  wurde  ein  Zwischencode verwendet,  der  nur 
  229. leichte   Einschränkungen  gegenüber  der   vollständigen   Syntax 
  230. aufweist, der aber leicht in den vom inneren Interpreter benutzten 
  231. Code übersetzt werden kann. Näheres dazu im Anhang.
  232.  
  233. Der  innere Interpreter ruft das Prädikat ear / 0 auf,  sobald  er 
  234. vom Benutzer-Eingabestrom 'user' lesen soll. 
  235. Dieses  Prädikat ruft die Hauptschleife des  äußeren  Interpreters 
  236. auf; ihr Name ist loop / 0.
  237. In der Schleife wird der Benutzer durch den Prompt
  238. ?-
  239. aufgefordert, einen Term einzugeben, der danach auf folgende Weise 
  240. ausgeführt wird :
  241.  
  242. (1)  Variablen oder fehlerhafte Terme werden ignoriert.
  243. (2)  Zahlen erzeugen eine Fehlermeldung.
  244. (3)  Terme der Form "Kopf :- Rumpf" oder "Links --> Rechts" werden 
  245.      als  Regeln in die Datenbank übernommen (grammatische  Regeln 
  246.      mit '-->' werden vorher übersetzt).
  247. (4)  Terme der Form ":- Rumpf" werden als Kommandos angesehen  und 
  248.      deterministisch ausgeführt.
  249. (5)  Eine  Liste  wird als Liste von  Dateinamen  betrachtet.  Zur 
  250.      Auswertung   der   Liste  wird  das   Prädikat   'consultall' 
  251.      aufgerufen.
  252. (6)  Alle  anderen Terme werden als Anfragen behandelt :  es  wird 
  253.      versucht,  das beschriebene Ziel zu erfüllen. Gelingt das, so 
  254.      werden    die    resultierenden     Variableninstantiierungen 
  255.      ausgegeben,  und der Interpreter wartet auf die Eingabe eines 
  256.      Zeichens.  Ist  es  das  Zeichen ';',  so wird versucht,  die 
  257.      Anfrage neu zu erfüllen.
  258.      Enthält  die  Anfrage keine Variablen,  so wird bei  Gelingen 
  259.      'yes' ausgegeben.
  260.      Schlägt die Anfrage fehl, so wird 'no' ausgegeben.
  261.  
  262. Durch Aufruf des Prädikats 'stop' wird das Programm abgebrochen.
  263.  
  264.  
  265.      III. Systemfunktionen und vordefinierte Prädikate
  266.  
  267.      III.1 Allgemeines
  268.  
  269. Systemfunktionen  sind Funktionen,  die im eigentlichen  (inneren) 
  270. Interpreter  implementiert sind,  vordefinierte Prädikate sind  in 
  271. Prolog geschrieben und werden nach dem Start des Interpreters  aus 
  272. der Systemdatei 'SYSFILE.TOY' gelesen (siehe dazu den Anhang).
  273.  
  274. Die  grundlegenden  Funktionen von Prolog-10  werden  durch  diese 
  275. beiden  Gruppen  abgedeckt.  In  der  ATARI-Version  wurden  viele 
  276. zusätzliche  Systemfunktionen implementiert,  die den Zugriff  auf 
  277. spezielle   Eigenschaften  des  ST  (GEM  -   Grafikroutinen   und 
  278. Echtzeituhr) ermöglichen.
  279.  
  280. Eine Systemfunktion kann drei verschiedene Ergebnisse produzieren: 
  281. sie  kann  fehlschlagen,  erfüllt werden,  oder einen Systemfehler 
  282. produzieren.   Wird   eine   Systemfunktion  erfüllt,   so  treten 
  283. üblicherweise Nebeneffekte auf (z.B. Ausgabefunktionen).
  284.  
  285. Ein auftretender Fehler kann zur Folge haben, daß der Versuch, das 
  286. aktuelle Ziel zu erfüllen,  vollständig abgebrochen wird;  es kann 
  287. sogar (bei Speicherüberlauf) zum Abbruch des Interpreters  kommen. 
  288. Ein derart schwerwiegender Fehler wird durch die Meldung
  289. "Fatal error :  ..." angezeigt.  Nach einem solchen Fehler startet 
  290. der  Interpreter  selbständig das Prädikat ear /  0,  falls  nicht 
  291. gerade  eine  Datei  eingelesen wird.  Im Falle von  Fehlern  beim 
  292. Öffnen  oder  Schließen  von Dateien  werden  vorher  Eingabe  und 
  293. Ausgabe wieder auf Tastatur bzw. Bildschirm umgeleitet.
  294.  
  295. Im  Normalfall  wird  ein  Fehler  jedoch  durch  andere  Umstände 
  296. verursacht,  z.B.  durch  fehlerhafte  Parameter beim Aufruf einer 
  297. Systemfunktion.  In  diesem Fall wird die Erfüllung des  aktuellen 
  298. Zieles  nicht  abgebrochen;  es wird fortgefahren,  als ob der den 
  299. Fehler verursachende Term ein Aufruf des Prädikats error / 1 ist.
  300. Das  Argument  von  error(...) ist dabei  der  fehlerhafte  Aufruf 
  301. selbst.  error  / 1 ist in Prolog geschrieben und befindet sich in 
  302. der   Systemdatei;   der   Benutzer  kann  eigene   Fehlerroutinen 
  303. schreiben. error(...) kann auch explizit aufgerufen werden. In der 
  304. vorliegenden Version gibt error(Call) eine Meldung der Form
  305. "System call error : Call" aus, wenn der äußerste Funktor von Call 
  306. eine Systemfunktion bezeichnet, andernfalls einfach
  307. "Error : Call". Nach der Ausgabe schlägt error / 1 fehl.
  308.  
  309.  
  310.      III.2 Beschreibung der Systemfunktionen und vordefinierten
  311.            Prädikate
  312.  
  313. Bemerkung:     In den folgenden Beschreibungen werden Aussagen wie 
  314.                "ein Prädikat versucht,  zwei Terme zu unifizieren" 
  315.                gemacht, wenn das Prädikat je nach dem Ergebnis der 
  316.                Unifikation fehlschlägt oder erfüllt wird. Nach der 
  317.                Erfüllung sind die Terme unifiziert.
  318.                "Ein  Prädikat prüft eine Bedingung" bedeutet,  daß 
  319.                es  je nach dem Ergebnis der Bedingung  fehlschlägt 
  320.                oder erfüllt wird.
  321.  
  322. Parameter werden in den Beschreibungen wie folgt bezeichnet :
  323.  
  324.      TERM      irgendein Term
  325.      INTEGER   eine Integer-Zahl
  326.      VAR       eine Variable
  327.      VARINT    eine Integer-Zahl oder eine Variable
  328.      F_TERM    ein  Term  mit  Funktor und  keinem  oder  mehreren 
  329.                Argumenten
  330.      AUFRUF    siehe  F_TERM (aber im Sinne eines  zu  erfüllenden 
  331.                Zieles)
  332.      ATOM      ein Funktor ohne Argumente
  333.      NAME      siehe  ATOM (aber die betrachtete Funktion  bezieht 
  334.                sich auf den druckbaren Namen des Funktors)
  335.      ZEICHEN   ein aus einem einzelnen Zeichen bestehender NAME
  336.      DATEINAME der  Name eines Standard-Ein-/Ausgabestroms  (siehe 
  337.                die   Funktionen   see/tell   etc.),    oder   eine 
  338.                Spezifikation für eine Diskettendatei des TOS, also 
  339.                z.B. 'B:\ORDNER.1\PROLOG\DATEN.PRO'
  340.      AUFRUFLISTE    eine (möglicherweise leere) Liste von AUFRUFEN
  341.      ZEICHENLISTE   eine (möglicherweise leere) Liste von ZEICHEN
  342.      ZIFFERNLISTE   eine ZEICHENLISTE aus Ziffernzeichen
  343.  
  344. Die Parameter des beschriebenen Prädikates werden mit PAR_1, PAR_2 
  345. usw. bezeichnet.
  346.  
  347. In  TOY  Prolog  existieren vordefinierte  Operatoren,  von  denen 
  348. einige  die Namen von Prädikaten sind.  Eine Liste davon  befindet 
  349. sich bei der Beschreibung von op / 3 in Abschnitt III.2.5.4.
  350.  
  351.  
  352.      III.2.1 Allgemeine Prädikate
  353.  
  354. true 
  355.                kann immer erfüllt werden.
  356.  
  357. fail 
  358.                schlägt immer fehl.
  359.  
  360. not AUFRUF
  361.                wird erfüllt genau dann, wenn AUFRUF fehlschlägt.
  362.  
  363. AUFRUF, AUFRUF
  364.                wird  genau  dann  erfüllt,  wenn  beide  Parameter 
  365.                erfüllt werden können.
  366.  
  367. AUFRUF; AUFRUF
  368.                wird  genau dann erfüllt,  wenn einer der Parameter 
  369.                erfüllt werden kann.
  370.  
  371. check (AUFRUF)
  372.                wird genau dann erfüllt, wenn der Parameter erfüllt 
  373.                werden kann, aber instantiiert keine Variablen.
  374.  
  375. side_effects (AUFRUF)
  376.                äquivalent zu check(AUFRUF); sollte benutzt werden, 
  377.                um  zu  betonen,  daß die Seiteneffekte von  AUFRUF 
  378.                wichtig sind.
  379.  
  380. once (AUFRUF)
  381.                versucht,  AUFRUF deterministisch (genau einmal) zu 
  382.                erfüllen.
  383.  
  384.  
  385.      III.2.2 Arithmetik mit Integer-Zahlen
  386.  
  387. sum (INTEGER, INTEGER, INTEGER)
  388.                wird erfüllt genau dann, wenn PAR_1+PAR_2 = PAR_3.
  389.  
  390. sum (INTEGER, INTEGER, VAR)
  391.                wird  erfüllt,  nachdem  PAR_3  mit  dem  Wert  von 
  392.                PAR_1+PAR_2 unifiziert wurde.
  393.  
  394. sum (INTEGER, VAR, INTEGER)
  395.                wird   erfüllt,  nachdem  PAR_2  mit dem  Wert  von 
  396.                PAR_3-PAR_1 unifiziert wurde.
  397.  
  398. sum (VAR, INTEGER, INTEGER)
  399.                wird  erfüllt,  nachdem  PAR_1   mit  dem Wert  von 
  400.                PAR_3-PAR_2 unifiziert wurde.
  401.  
  402.  
  403. prod (INTEGER, INTEGER, INTEGER, INTEGER)
  404.                wird  erfüllt genau dann,  wenn PAR_1*PAR_2+PAR_3 = 
  405.                PAR_4.
  406.  
  407. prod (INTEGER, INTEGER, INTEGER, VAR)
  408.                wird  erfüllt,  nachdem  PAR_4 mit dem   Wert   von 
  409.                PAR_1*PAR_2+PAR_3 unifiziert wurde.
  410.  
  411. prod (INTEGER, INTEGER, VAR, INTEGER)
  412.                wird  erfüllt,  nachdem  PAR_3 mit  dem   Wert  von 
  413.                PAR_4-PAR_1*PAR_2 unifiziert wurde.
  414.  
  415. prod (INTEGER, VAR, VAR, INTEGER)
  416.                wird  erfüllt,  nachdem  PAR_2  mit  dem  Wert  von 
  417.                PAR_4  div PAR_1 und PAR_3 mit dem Wert  von  PAR_4 
  418.                mod PAR_1 unifiziert wurde.
  419.  
  420. prod (VAR, INTEGER, VAR, INTEGER)
  421.                wie  der vorherige Fall,  aber PAR_1 vertauscht mit 
  422.                PAR_2.
  423.  
  424. prod (INTEGER, VAR, INTEGER, INTEGER)
  425.                schlägt fehl, wenn (PAR_4-PAR_3) mod PAR_1 ungleich 
  426.                0  ist;  andernfalls wird es erfült,  nachdem PAR_2 
  427.                mit dem Wert von (PAR_4-PAR_3) div PAR_1 unifiziert 
  428.                wurde.
  429.  
  430. prod (VAR, INTEGER, INTEGER, INTEGER)
  431.                wie  der vorherige Fall,  aber PAR_1 vertauscht mit 
  432.                PAR_2.
  433.  
  434.  
  435. TERM is TERM
  436.                Es wird angenommen,  daß PAR_2 ein aus INTEGERs und 
  437.                den  Standardoperatoren  +,  -  (beide  binär  oder 
  438.                unär),    *,    /    und    mod   zusammengesetzter 
  439.                arithmetischer Ausdruck ist;  falls nicht,  schlägt 
  440.                das  Prädikat fehl (es kann auch  zu  Systemfehlern 
  441.                kommen, falls PAR_2 freie Variablen enthält).
  442.                Falls  PAR_2  ein  Ausdruck  ist,  wird  sein  Wert 
  443.                berechnet und versucht, PAR_1 damit zu unifizieren. 
  444.                is   kann auch eine Liste der Form [ INTEGER ]  als 
  445.                den  Wert dieser Integer-Zahl berechnen  (nach  den 
  446.                Konventionen von Prolog-10).
  447.  
  448.  
  449.                is  wird von anderen Prädikaten benutzt,  die  ihre 
  450.                Argumente als Ausdrücke ansehen,z.B. den folgenden.
  451.  
  452.  
  453.      III.2.3 Vergleich von Zahlen bzw. Namen
  454.  
  455.  
  456. less (INTEGER, INTEGER)
  457.                wird erfüllt genau dann, wenn PAR_1 < PAR_2.
  458.  
  459. TERM =:= TERM
  460.                wird  erfüllt  genau  dann,  wenn PAR_1  und  PAR_2 
  461.                arithmetische  Ausdrücke sind,  die denselben  Wert 
  462.                haben.
  463.  
  464. TERM =\= TERM  ( =\= )
  465.                wie =:=,  aber überprüft,  ob die Werte verschieden 
  466.                sind.
  467.  
  468. TERM < TERM    ( < )
  469.                wie  =:=,  aber  überprüft,  ob der Wert von  PAR_1 
  470.                kleiner als der Wert von PAR_2 ist.
  471.  
  472. TERM =< TERM   ( =< )
  473.                wie <, aber überprüft auf "kleiner oder gleich".
  474.  
  475. TERM > TERM    ( > )
  476.                wie <, aber überprüft auf "größer".
  477.  
  478. TERM >= TERM   ( >= )
  479.                wie <, aber überprüft auf "größer oder gleich".
  480.  
  481.  
  482. NAME @< NAME   ( @< )
  483.                wird  genau dann erfüllt,  wenn PAR_1 in der  durch 
  484.                den  erweiterten  ASCII-Zeichensatz  des  ATARI  ST 
  485.                definierten lexikographischen Reihenfolge vor PAR_2 
  486.                steht.
  487.  
  488. NAME @=< NAME  ( @=< )
  489.                wie @<, aber überprüft auf "kleiner oder gleich".
  490.  
  491. NAME @> NAME   ( @> )
  492.                wie @<, aber überprüft auf "größer".
  493.  
  494. NAME @>= NAME  ( @>= )
  495.                wie @<, aber überprüft auf "größer oder gleich".
  496.  
  497.  
  498.      III.2.4 Vergleich von Termen
  499.  
  500. TERM = TERM
  501.                versucht, PAR_1 und PAR_2 zu unifizieren.
  502.  
  503. eqvar (VAR, VAR)
  504.                wird genau dann erfüllt,  wenn PAR_1 und PAR_2 zwei 
  505.                Instanzen derselben, nicht-anonymen Variable sind.
  506.  
  507. TERM == TERM
  508.                wird genau dann erfüllt,  wenn PAR_1 und PAR_2 zwei 
  509.                Instanzen desselben Terms sind.
  510.  
  511. TERM \== TERM  ( \== )
  512.                wird genau dann erfüllt, wenn PAR_1 und PAR_2 nicht 
  513.                zwei Instanzen desselben Terms sind.
  514.  
  515.  
  516.      III.2.5 Ein- und Ausgabe
  517.  
  518.      III.2.5.1 Datenströme
  519.  
  520. Die  Ein-  und  Ausgabe  in TOY  Prolog  ST  ist  an  Datenströmen 
  521. orientiert. Ein Datenstrom ist (vom Benutzer aus gesehen) der Name 
  522. bzw. die vollständige Spezifikation einer Diskettendatei, oder der 
  523. vordefinierte Name eines speziellen Ein- oder Ausgabegerätes.
  524.  
  525. Auf eine Diskettendatei kann - sofern sie nicht vom Betriebssystem 
  526. aus  gegen  Überschreiben geschützt ist,  und sie sich  nicht  auf 
  527. einer schreibgeschützten Diskette befindet,  schreibend und lesend 
  528. zugegriffen werden. Namen von Datei-Strömen können z.B. sein :
  529.  
  530. editor         (eines der Hilfsprogramme)
  531. 'sysfile.toy'  (die Systemdatei)
  532. 'b:\ordner.1\daten' (eine Datei namens 'daten' auf einer  Diskette 
  533.                     im Laufwerk B im Ordner 'ordner.1')
  534.  
  535. Bei  Datei-Strömen  können  Groß-  und  Kleinschreibung   beliebig 
  536. gewählt werden.
  537.  
  538. Ein Dateistrom kann nur in eine Richtung, also nur lesend oder nur 
  539. schreibend, geöffnet werden. Wird ein Dateistrom mehrmals in einer 
  540. Richtung geöffnet, so hat das keine Wirkung.
  541.  
  542. Die  vordefinierten  Datenströme sind vorhanden,  um  mit  anderen 
  543. Geräten bzw. Komponenten des Computers zu kommunizieren.
  544. Auf  die  vordefinierten Datenströme kann nicht immer  lesend  und 
  545. schreibend zugegriffen werden,  aber ein vordefinierter Datenstrom 
  546. kann,  falls  Lese-  und  Schreibzugriff erlaubt  sind,  in  beide 
  547. Richtungen gleichzeitig geöffnet werden.
  548.  
  549. Eine  Liste  der  vordefinierten  Datenströme  mit  den  erlaubten 
  550. Zugriffsarten :
  551.  
  552.      Name      Lesezugriff                   Schreibzugriff
  553.  
  554.      user      Standard-Benutzereingabe      Standard-Benutzerausgabe
  555.                (Tastatur, gepuffert)         (Bildschirm)
  556.  
  557.      keybd     Benutzereingabe               Ausgabe an den
  558.                (Tastatur, Einzelzeichen)     Tastaturcontroller.
  559.  
  560.      modem     RS232-Interface lesen         RS232 schreiben
  561.  
  562.      midi      MIDI-Interface lesen          MIDI schreiben
  563.  
  564.      printer   nicht erlaubt !               Centronics-Interface
  565.  
  566. Diese Namen können wieder groß- oder kleingeschrieben werden  (bei 
  567. Großschreibung Apostrophen nicht vergessen).
  568.  
  569.  
  570.      III.2.5.2 Umschalten der Ein- und Ausgabeströme
  571.  
  572. Es können bis zu 16 Dateiströme gleichzeitig offen sein.
  573.  
  574. see (DATEINAME)
  575.                der   angegebene  Datenstrom  wird  zum   aktuellen 
  576.                Eingabestrom;  handelt  es sich um eine noch  nicht 
  577.                geöffnete Datei, so wird diese zum Lesen geöffnet.
  578.  
  579. seeing (TERM)
  580.                versucht,   den   Parameter   mit   dem   aktuellen 
  581.                Eingabestrom zu unifizieren.
  582.  
  583. seen 
  584.                ist der aktuellen Eingabestrom eine Datei,  so wird 
  585.                sie   geschlossen.   Der  vordefinierte  Datenstrom 
  586.                'user' wird zum aktuellen Eingabestrom.
  587.  
  588. tell (DATEINAME)
  589.                der   angegebene  Datenstrom  wird  zum   aktuellen 
  590.                Ausgabestrom;  handelt  es sich um eine noch  nicht 
  591.                geöffnete  Datei,  so  wird diese auf der  Diskette 
  592.                erzeugt  (eine eventuell vorhandene Datei  mit  dem 
  593.                gleichen  Namen wird gelöscht !) und zum  Schreiben 
  594.                geöffnet.
  595.  
  596. telling (TERM)
  597.                versucht,   den   Parameter   mit   dem   aktuellen 
  598.                Ausgabestrom zu unifizieren.
  599.  
  600. told 
  601.                ist  der aktuelle Ausgabestrom eine Datei,  so wird 
  602.                sie   geschlossen.   Der  vorgefinierte  Datenstrom 
  603.                'user' wird zum aktuellen Ausgabestrom.
  604.  
  605.  
  606.      III.2.5.3 Kontrolle der Eingabe
  607.  
  608. TOY  Prolog besitzt die Fähigkeit,  die von einem Dateistrom  oder 
  609. einem  Peripheriegerät eingelesenen Zeichen zur Kontrolle auf  dem 
  610. Bildschirm auszugeben.
  611.  
  612. echo 
  613.                schaltet die Kontrollausgabe ein.
  614.  
  615. noecho 
  616.                schaltet die Kontrollausgabe aus.
  617.  
  618.  
  619.      III.2.5.4 Ein- und Ausgabe von Termen; Operatoren
  620.  
  621.  
  622. display (TERM)
  623.                gibt   TERM  in  Standardform  auf  den   aktuellen 
  624.                Ausgabestrom  aus :  Funktoren werden in Präfixform 
  625.                mit  Klammern  ausgegeben,  Namen werden  nicht  in 
  626.                Apostrophen   gesetzt;   Variablen  werden  als  _N 
  627.                ausgegeben, wobei N eine Zahl ist.
  628.  
  629. write (TERM)
  630.                gibt  TERM auf den aktuellen Ausgabestrom aus;  die 
  631.                momentanen Operatorvereinbarungen werden  beachtet, 
  632.                aber  Namen  werden nicht in  Apostrophen  gesetzt. 
  633.                Variablen werden in der Form XN ausgegeben, wobei N 
  634.                eine Zahl ist; die Numerierung beginnt bei 1.
  635.                Achtung  :  In  TOY  Prolog wird  zur  Ausgabe  von 
  636.                Variablen  ein Prädikat benutzt,  das die Variablen 
  637.                numeriert,  indem  es sie an Terme der Form  'V'(N) 
  638.                bindet.  Aus  diesem  Grund werden Terme  der  Form 
  639.                'V'(N)  nicht  korrekt  ausgegeben,   wenn  N  eine 
  640.                Integer-Zahl ist.
  641.  
  642. writeq (TERM)
  643.                wie  'write',  aber Namen,  die keine wohlgeformten 
  644.                Worte  darstellen,  oder  die in Konflikt zu  einer 
  645.                momentanen  Operatorvereinbarung stehen,  werden in 
  646.                Apostrophen  gesetzt.   Terme,   die  mit  'writeq' 
  647.                ausgegeben   wurden,   können  mit  'read'   wieder 
  648.                eingelesen werden.
  649.  
  650. read (TERM)
  651.                liest einen durch einen Punkt abgeschlossenen  Term 
  652.                vom aktuellen Eingabestrom;  wird nur erfüllt, wenn 
  653.                dieser  Term mit PAR_1 unifiziert werden kann.  Die 
  654.                momentanen Operatorvereinbarungen werden  beachtet. 
  655.                Falls  der  eingegebene  Term  syntaktische  Fehler 
  656.                enthält, so wird die Meldung
  657.                "Bad Term on input. Text skipped:"
  658.                ausgegeben,   und  der  eingegebene  Text  bis  zum 
  659.                nächsten  Punkt  außerhalb  eines  Kommentares  und 
  660.                außerhalb von Anführungszeichen übersprungen (falls 
  661.                kein  Punkt vorhanden ist,  sollte der Benutzer ihn 
  662.                eingeben).  Danach wird versucht, PAR_1 mit 'e r r' 
  663.                zu unifizieren.
  664.                Am  Ende  eines Dateistromes wird die  Eingabe  auf 
  665.                'user' umgeschaltet.
  666.  
  667.  
  668. op (INTEGER, ATOM, ATOM)
  669.                vereinbart  PAR_3  als Operator mit Typ  PAR_2  und 
  670.                Priorität  PAR_1.  Es muß gelten 1 ≤ PAR_1 ≤  1200; 
  671.                Operatoren  mit kleinerer Priorität haben  Vorrang. 
  672.                Die  Priorität  sollte kleiner als  1000  sein,  um 
  673.                Konflikte  mit den  Operatoren ',', ';', ':-'   und 
  674.                '-->' zu vermeiden.
  675.                PAR_2 muß aus der Menge { xf, yf, fx, fy, xfx, xfy, 
  676.                yfx,   yfy   }  gewählt  werden.   PAR_3  muß  ohne 
  677.                Apostrophen druckbar sein.
  678.                Falls  für PAR_3 bereits eine  Operatorvereinbarung 
  679.                besteht,  so wird diese gemäß den Angaben von PAR_1 
  680.                und PAR_2, modifiziert : die neue Priorität ersetzt 
  681.                die  alte  und  der neue unäre  (bzw.  binäre)  Typ 
  682.                ersetzt den alten unären (bzw. binären) Typ. In TOY 
  683.                Prolog kann ein Operator nur einen unären und einen 
  684.                binären  Typ gleichzeitig besitzen (beide  mit  der 
  685.                gleichen Priorität).
  686.  
  687. delop (ATOM)
  688.                die  Operatorvereinbarung für PAR_1 wird  gelöscht. 
  689.                PAR_1  sollte in Apostrophen gesetzt werden,  da es 
  690.                zum  Zeitpunkt der Eingabe von 'delop' ja noch  ein 
  691.                Operator ist.
  692.  
  693. Folgende Standardoperatoren sind bereits vereinbart :
  694.  
  695.                :-        xfx, fx        1200
  696.                -->       xfx            1200
  697.                ;         xfy            1100
  698.                ,         xfy            1000
  699.                not       fy             900
  700.                =         xfx            700
  701.                is        xfx            700
  702.                =:=       xfx            700
  703.                =\=       xfx            700
  704.                <         xfx            700
  705.                =<        xfx            700
  706.                >         xfx            700
  707.                >=        xfx            700
  708.                @<        xfx            700
  709.                @=<       xfx            700
  710.                @>        xfx            700
  711.                @>=       xfx            700
  712.                ==        xfx            700
  713.                \==       xfx            700
  714.                =..       xfx            700
  715.                +         yfx, fx        500
  716.                -         yfx, fx        500
  717.                *         yfx            400
  718.                /         yfx            400
  719.                mod       xfx            300
  720.  
  721.  
  722.      III.2.5.5 Einzelzeichen
  723.  
  724. In TOY Prolog werden Einzelzeichen, anders als in Prolog-10, durch 
  725. Atome dargestellt, deren Namen aus genau einem Zeichen besteht (in 
  726. Prolog-10 als deren ASCII-Darstellung, also als Zahlen).
  727. TOY  Prolog  ST unterstützt den erweiterten Zeichensatz  von  GEM; 
  728. dabei  werden deutsche (französische,  spanische,  ...) Buchstaben 
  729. auch wirklich als Buchstaben erkannt (!).
  730. Für  Zeichenketten  existiert  eine  besondere   Darstellungsform. 
  731. Zeichenketten  werden  als  Listen  von  Einzelzeichen  betrachtet 
  732. (nicht wie in Prolog-10 als Listen von ASCII-Codes);  die Notation 
  733. für   Zeichenketten   benutzt  Anführungszeichen  ("),   um   eine 
  734. Zeichenkette    einzuschließen.    Wie   üblich   bezeichnet   ein 
  735. verdoppeltes Anführungszeichen ("") im Inneren einer  Zeichenkette 
  736. ein in die Zeichenkette aufzunehmendes einzelnes ".
  737.  
  738. Die   folgenden   Prädikate   sind  für   die   Verarbeitung   von 
  739. Einzelzeichen vorgesehen:
  740.  
  741. ordchr (INTEGER, ZEICHEN)
  742.                wird genau dann erfüllt, wenn PAR_1 die Ordinalzahl 
  743.                des Zeichens PAR_2 ist.
  744.  
  745. ordchr (VAR, ZEICHEN)
  746.                wird erfüllt, nachdem PAR_1 mit der Ordinalzahl von 
  747.                PAR_2 unifiziert wurde.
  748.  
  749. ordchr (INTEGER, VAR)
  750.                wird   erfüllt,   nachdem  PAR_2  mit  dem  Zeichen 
  751.                unifiziert wurde,  dessen Ordinalzahl PAR_1 mod 256 
  752.                ist.
  753.  
  754. iseoln (TERM)
  755.                versucht,   PAR_1   mit  dem  Zeilenendezeichen  zu 
  756.                unifizieren. TOY Prolog wandelt jedes Zeilenende in 
  757.                ein einzelnes 'CR' um.
  758.  
  759. smalletter (TERM)
  760.                überprüft, ob PAR_1 ein Kleinbuchstabe ist.
  761.  
  762. bigletter (TERM)
  763.                überprüft, ob PAR_1 ein Großbuchstabe ist.
  764.  
  765. letter (TERM)
  766.                überprüft, ob PAR_1 ein Buchstabe ist.
  767.  
  768. digit (TERM)
  769.                überprüft, ob PAR_1 eine Dezimalziffer ist.
  770.  
  771. alphanum (TERM)
  772.                überprüft, ob PAR_1 ein Buchstabe, eine Ziffer oder 
  773.                ein Tiefstrich (_) ist.
  774.  
  775.  
  776. bracket (TERM)
  777.                überprüft,  ob  PAR_1 eines der Zeichen ( ) [ ] { } 
  778.                ist.
  779.  
  780. solochar (TERM)
  781.                überprüft, ob PAR_1 eines der Zeichen ! , ; ist.
  782.  
  783. symch (TERM)
  784.                überprüft, ob PAR_1 ein Symbolzeichen ist.
  785.  
  786.  
  787.      III.2.5.6 Ein- und Ausgabe von Einzelzeichen
  788.  
  789. Für  die  Ein- und Ausgabe von Einzelzeichen gibt es  eine  Anzahl 
  790. besonderer  Prädikate.  Diese arbeiten nicht - wie in Prolog-10  - 
  791. mit  ASCII-Codes.  Die  Prädikate von Prolog-10,  die die Ein- und 
  792. Ausgabe  von  Einzelzeichen  erledigen,  könnten  etwa  wie  folgt 
  793. definiert werden (nicht vollständig kompatibel):
  794.  
  795.      get0(Ord) :- rch, lastch(Ch), ordchr(Ord, Ch).
  796.      get(Ord)  :- rch, skipbl, lastch(Ch), ordchr(Ord, Ch).
  797.      skip(X)   :- repeat, get0(X), !.
  798.      put(Ord)  :- ordchr(Ord, Ch), wch(Ch).
  799.  
  800. Der  Hauptunterschied  zwischen TOY Prolog und Prolog-10  bei  der 
  801. Verarbeitung  von Einzelzeichen liegt darin,  daß TOY Prolog einen 
  802. Puffer für das letzte eingegebene Zeichen unterhält; in TOY Prolog 
  803. kann daher mehrmals,  auch nach eventuellem Backtracking,  auf ein 
  804. eingegebenes Zeichen zugegriffen werden.
  805.  
  806. Wird  bei der Eingabe ein Zeilenende erreicht,  so wird es als ein 
  807. einzelnes   'CR'   in  den   Eingabepuffer   ("letztes   Zeichen") 
  808. geschrieben.  Wird das Ende eines Dateistromes erreicht,  so führt 
  809. der Interpreter selbständig das Prädikat 'seen' aus; die folgenden 
  810. Zeichen werden vom Benutzerstrom gelesen.  Dieser Vorgang wird dem 
  811. Benutzer durch eine Meldung mitgeteilt.
  812.  
  813.  
  814. Die Prädikate für die Ein- und Ausgabe von Einzelzeichen :
  815.  
  816. rch 
  817.                wird  erfüllt,  nachdem  das  nächste  Zeichen  vom 
  818.                aktuellen   Eingabestrom  in  das  letzte   Zeichen 
  819.                geschrieben wurde.
  820.  
  821. skipbl 
  822.                wird erfüllt, nachdem sichergestellt wurde, daß das 
  823.                letzte  Zeichen  ein druckbares    Zeichen  enthält 
  824.                (ASCII-Code  >  32).   Falls  ein  solches  Zeichen 
  825.                bereits  im  letzten  Zeichen  steht,  wird  nichts 
  826.                getan, andernfalls wird 'rch' ausgeführt.
  827.  
  828. lastch (TERM)
  829.                versucht,   PAR_1   mit  dem  letzten  Zeichen   zu 
  830.                unifizieren.
  831.  
  832. rdch (TERM)
  833.                liest  das  nächste Zeichen  vom  Eingabestrom  und 
  834.                schreibt es in das letzte Zeichen; macht eine Kopie 
  835.                des letzten Zeichens,  wobei nichtdruckbare Zeichen 
  836.                als Leerraum angesehen werden;  versucht, die Kopie 
  837.                mit PAR_1 zu unifizieren.
  838.  
  839. rdchsk (TERM)
  840.                wie 'rdch', aber vorher wird 'skipbl' ausgeführt.
  841.  
  842. wch (ZEICHEN)
  843.                schreibt das Zeichen in den aktuellen Ausgabestrom. 
  844.                'CR' wird als Zeilentrenner interpretiert.
  845.  
  846. nl 
  847.                beendet die momentane Zeile (gibt 'CR' aus).
  848.  
  849. bell 
  850.                gibt  das  Zeichen 'Bel' aus;  bei Ausgabe auf  den 
  851.                Benutzerstrom  bewirkt dieses Zeichen  das  Ertönen 
  852.                eines 'Glockentones'.
  853.  
  854. Der  ATARI  ST  interpretiert  das  Zeichen  'Esc'  (escape)   als 
  855. besonderes   Steuerzeichen;   wird  'Esc'  auf  den  Benutzerstrom 
  856. ausgegeben,  so bewirken die nächsten 1-3 Zeichen eine Veränderung 
  857. von  Parametern  der Bildschirmausgabe.  Es  existieren  spezielle 
  858. Prädikate zur Ausgabe von Escape-Sequenzen :
  859.  
  860. escape 
  861.                gibt 'Esc' aus.
  862.  
  863. cls 
  864.                gibt  'Esc',  'E'  aus;  der Bildschirminhalt  wird 
  865.                gelöscht.
  866.  
  867.  
  868.      III.2.6 Typenüberprüfung
  869.  
  870. var (TERM)
  871.                wird  genau  dann erfüllt,  wenn PAR_1  eine  freie 
  872.                Variable ist.
  873.  
  874. integer (TERM)
  875.                wird  genau dann erfüllt,  wenn PAR_1 eine Integer-
  876.                Zahl ist.
  877.  
  878. nonvarint (TERM)
  879.                wird genau dann erfüllt, wenn PAR_1 ein F_TERM ist.
  880.  
  881. atom (TERM)
  882.                wird genau dann erfüllt, wenn PAR_1 ein ATOM ist.
  883.  
  884.  
  885.      III.2.7 Zugriff auf die Termstruktur
  886.  
  887. pname (NAME, TERM)
  888.                erzeugt eine Liste der einzelnen Zeichen von  PAR_1 
  889.                und versucht, diese Liste mit PAR_2 zu unifizieren.
  890.  
  891. pname (VAR, ZEICHENLISTE)
  892.                wird   erfüllt,   nachdem  PAR_1  mit  einem  NAMEn 
  893.                unifiziert wurde, der aus den einzelnen Zeichen von 
  894.                PAR_2 besteht.
  895.  
  896. pnamei (INTEGER, TERM)
  897.                erzeugt  eine  Liste von  Ziffernzeichen,  die  die 
  898.                dezimale   Darstellung   von  PAR_1   bilden,   und 
  899.                versucht,  diese  Liste  mit PAR_2 zu  unifizieren. 
  900.                PAR_1 darf nicht negativ sein.
  901.  
  902. pnamei (VAR, ZIFFERNLISTE)
  903.                wird  erfüllt,  nachdem PAR_1 mit der  Integer-Zahl 
  904.                unifiziert  wurde,   deren  Dezimaldarstellung  die 
  905.                Zeichen   von  PAR_2  sind.   Auch  bei   korrekten 
  906.                Parametern kann ein Fehler auftreten, wenn die Zahl 
  907.                größer  als  die größte  darstellbare  Integer-Zahl 
  908.                wird.  In  dieser  Implementation sind  Zahlen  bis 
  909.                32767 ( = 215-1) darstellbar.
  910.  
  911. 'pname'  und 'pnamei' ersetzen die Funktion 'name' von  Prolog-10, 
  912. die  zwar ähnlich arbeitet,  aber ASCII-Codes anstelle der in  TOY 
  913. Prolog verwendeten Zeichendarstellung benutzt.
  914.  
  915.  
  916. functor (VAR, INTEGER, 0)
  917.                PAR_3  ist die Zahl 0;  dieser Aufruf wird erfüllt, 
  918.                nachdem PAR_1 mit PAR_2 unifiziert wurde.
  919.  
  920. functor (VAR, NAME, INTEGER)
  921.                wird  erfüllt,   nachdem  PAR_1  mit  einem  F_TERM 
  922.                unifiziert wurde,  dessen Funktor den Namen und die 
  923.                Stelligkeit   hat,   die  durch  PAR_2  und   PAR_3 
  924.                festgelegt    werden,    und    dessen    Argumente 
  925.                verschiedene freie Variablen sind. PAR_3 darf nicht 
  926.                negativ sein.
  927.  
  928. functor (INTEGER, TERM, TERM)
  929.                versucht,  PAR_2 mit PAR_1 und PAR_3 mit der Zahl 0 
  930.                zu unifizieren.
  931.  
  932. functor (F_TERM, TERM, TERM)
  933.                versucht,  PAR_2  mit  dem Namen und PAR_3 mit  der 
  934.                Stelligkeit  des  äußersten Funktors von  PAR_1  zu 
  935.                unifizieren.
  936.  
  937. arg (INTEGER, F_TERM, TERM)
  938.                schlägt fehl, falls PAR_1 kleiner als 1 oder größer 
  939.                als  die  Stelligkeit des  äußersten  Funktors  von 
  940.                PAR_2 ist;  ansonsten wird versucht,  PAR_3 mit dem 
  941.                PAR_1-ten Argument von PAR_2 zu unifizieren.
  942.  
  943. VAR =.. [INTEGER]
  944.                wird  erfüllt,  nachdem PAR_1 mit der Zahl in PAR_2 
  945.                unifiziert wurde.
  946.  
  947. VAR =.. [NAME | TERM]
  948.                falls der TERM in PAR_2 keine 'geschlossene'  Liste 
  949.                ist, wird ein Fehler im Prädikat length / 2 erzeugt 
  950.                ('=..'  benutzt 'length').  Ansonsten wird ein Term 
  951.                erzeugt,    dessen    Funktor   NAME   und   dessen 
  952.                Argumentliste  TERM ist;dieser Term wird mit  PAR_1 
  953.                unifiziert.
  954.  
  955. INTEGER =.. TERM
  956.                versucht, PAR_2 mit [PAR_1] zu unifizieren.
  957.  
  958. F_TERM =.. TERM
  959.                erzeugt eine Liste, deren Kopf der äußerste Funktor 
  960.                von  PAR_1 und deren Rumpf die Liste der  Argumente 
  961.                von PAR_1 ist;  versucht,  diese Liste mit PAR_2 zu 
  962.                unifizieren.
  963.  
  964.  
  965.      III.2.8 Zugriff auf Prädikate in der Datenbank
  966.  
  967. protect (NAME, INTEGER)
  968.                schützt   das   Prädikat  mit   Namen   PAR_1   und 
  969.                Stelligkeit  PAR_2  gegen Veränderungen  durch  die 
  970.                weiter unten angegebenen Prädikate.
  971.  
  972. protect 
  973.                schützt  sämtliche  in  der  Datenbank  vorhandenen 
  974.                Prädikate.
  975.  
  976. unprotect (NAME, INTEGER)
  977.                hebt  den Schutz für das Prädikat mit  Namen  PAR_1 
  978.                und Stelligkeit PAR_2 wieder auf.
  979.  
  980. unprotect 
  981.                hebt den Schutz aller Prädikate auf.
  982.  
  983. Die Datenbank kann durch folgende Prädikate verändert werden:
  984.  
  985. assert (F_TERM, AUFRUFLISTE, INTEGER)
  986.                PAR_1  wird als der Kopf einer Klausel,  PAR_2  als 
  987.                deren  Rumpf betrachtet;  diese Klausel wird direkt 
  988.                nach der n-ten Klausel der entsprechenden  Prozedur 
  989.                in  die Datenbank eingefügt ( n = PAR_3,  falls die 
  990.                Klausel mit dieser Nummer existiert; n = Nummer der 
  991.                letzten Klausel, falls PAR_3 > Anzahl der Klauseln; 
  992.                falls  keine Klauseln existieren,  bzw.  PAR_3 < 1, 
  993.                wird die neue Klausel als erste eingefügt).
  994.  
  995. retract (NAME, INTEGER, INTEGER)
  996.                PAR_2  darf  nicht negativ sein.  PAR_1  und  PAR_2 
  997.                geben  Namen und Stelligkeit eines  Prädikates  an; 
  998.                falls das entsprechende Prädikat keine Klausel  mit 
  999.                der  Nummer PAR_3 besitzt,  schlägt 'retract' fehl; 
  1000.                sonst  wird  die  entsprechende  Klausel  aus   der 
  1001.                Datenbank  entfernt,  und  'retract' wird  erfüllt. 
  1002.                Achtung  :  Falls  zum Zeitpunkt der Löschung  noch 
  1003.                Instanzen der gelöschten Klausel aktiv sind, werden 
  1004.                in  den  allermeisten Fällen  katastrophale  Fehler 
  1005.                auftreten !
  1006.  
  1007. clause (NAME, INTEGER, INTEGER, TERM, TERM)
  1008.                PAR_2  darf  nicht negativ sein.  PAR_1  und  PAR_2 
  1009.                geben  Namen und Stelligkeit eines  Prädikates  an; 
  1010.                falls das entsprechende Prädikat keine Klausel  mit 
  1011.                der  Nummer PAR_3 besitzt,  schlägt 'clause'  fehl; 
  1012.                sonst wird versucht, PAR_4 mit deren Kopf und PAR_5 
  1013.                mit deren Rumpf zu unifizieren.
  1014.  
  1015.  
  1016. asserta (F_TERM)
  1017.                behandelt   PAR_1  als  eine  Klausel;   falls  der 
  1018.                äußerste  Funktor  ':-' ist,  und das erste  seiner 
  1019.                Argumente  kein F_TERM ,  wird ein Fehler  erzeugt. 
  1020.                Die   Klausel   wird   als   erste   Klausel    des 
  1021.                entsprechenden   Prädikates   in   die    Datenbank 
  1022.                eingefügt.
  1023.  
  1024. assertz (F_TERM)
  1025.                wie  'asserta',  aber  die Klausel wird als  letzte 
  1026.                Klausel   des  entsprechenden  Prädikates  in   die 
  1027.                Datenbank eingefügt.
  1028.  
  1029. assert (F_TERM)
  1030.                ein Synonym für 'asserta'.
  1031.  
  1032. retract (F_TERM)
  1033.                behandelt  PAR_1  als  eine  Klausel;  falls  deren 
  1034.                äußerster  Funktor  ':- ist,  und das erste  seiner 
  1035.                Argumente kein F_TERM,  so wird ein Fehler erzeugt. 
  1036.                Die erste Klausel,  die mit PAR_1 unifiziert werden 
  1037.                kann,  wird aus der Datenbank entfernt (falls PAR_1 
  1038.                die  Form  F_TERM  :-  VAR hat,  kann  es  nur  mit 
  1039.                Klauseln  unifiziert werden,  deren Rumpf aus einem 
  1040.                einzigen Variablenaufruf besteht !). Wenn 'retract' 
  1041.                wiedererfüllt  werden  soll,  wird die nächste  mit 
  1042.                PAR_1 unifizierbare Klausel entfernt, usw.
  1043.  
  1044. clause (F_TERM, TERM)
  1045.                findet die erste Klausel,  deren Kopf mit PAR_1 und 
  1046.                deren Rumpf mit PAR_2 unifiziert werden kann.  Wird 
  1047.                nach   erfolgreicher  Unifikation   erfüllt;   soll 
  1048.                'clause' wiedererfüllt werden,  so wird die nächste 
  1049.                Klausel gesucht, usw.
  1050.  
  1051. redefine 
  1052.                wird   für  die  Implementierung  von   'reconsult' 
  1053.                gebraucht (sollte nicht direkt aufgerufen  werden). 
  1054.                Zwischen zwei Aufrufen von 'redefine' verhält  sich 
  1055.                'assert' anders als normal :  wenn eine Klausel mit 
  1056.                'assert' gespeichert werden soll,  die nicht zu dem 
  1057.                zuletzt mit 'assert' gespeicherten Prädikat gehört, 
  1058.                wird  vorher das gesamte Prädikat gelöscht,  zu dem 
  1059.                die neue Klausel gehört.
  1060.  
  1061. abolish (NAME, INTEGER)
  1062.                PAR_2  darf  nicht negativ sein;  das Prädikat  mit 
  1063.                Namen PAR_1 und Stelligkeit PAR_2 wird  vollständig 
  1064.                gelöscht.
  1065.  
  1066.  
  1067. predefined (NAME, INTEGER)
  1068.                PAR_2   darf  nicht  neagtiv   sein;   'predefined' 
  1069.                überprüft,  ob  das  Prädikat mit Namen  PAR_1  und 
  1070.                Stelligkeit PAR_2 eine Systemfunktion ist.
  1071.  
  1072. consult (DATEINAME)
  1073.                schaltet  den aktuellen Eingabestrom um  und  liest 
  1074.                Klauseln,  die  danach  mit  'assertz'  gespeichert 
  1075.                werden.  Es  gibt  dabei zwei Ausnahmen :  der Term 
  1076.                'end' beendet den Einlesemodus und stellt den alten 
  1077.                Eingabestrom  wieder her;  Terme mit  dem   Funktor 
  1078.                ':-'/1  werden als Kommandos betrachtet und  sofort 
  1079.                ausgeführt.
  1080.  
  1081. reconsult (DATEINAME)
  1082.                wie 'consult',  aber vor und nach dem Einlesen wird 
  1083.                'redefine'  aufgerufen,   so  daß  zusammenhängende 
  1084.                Folgen  von  Klauseln  eines  Prädikates  das  alte 
  1085.                Prädikat ersetzen, statt es zu ergänzen.
  1086.  
  1087. consultall (TERM)
  1088.                PAR_1 muß eine Liste von DATEINAMEn oder Termen der 
  1089.                Form '- DATEINAME' sein (auch gemischt);  für jeden 
  1090.                einfachen  DATEINAMEN  wird  'consult',  für  jeden 
  1091.                DATEINAMEN  mit '-'/1 wird 'reconsult'  aufgerufen. 
  1092.                Dieses Prädikat wird von der  Benutzerschnittstelle 
  1093.                aufgerufen, wenn eine Liste als Kommando eingegeben 
  1094.                wurde.
  1095.  
  1096. listing (F_TERM)
  1097.                PAR_1  muß  ein  ATOM,   oder  ein  Term  der  Form 
  1098.                ATOM/INTEGER,  oder eine (eventuell verschachtelte) 
  1099.                Liste solcher Terme sein; jedes ATOM wird als Name, 
  1100.                jede   Zahl   als  Stelligkeit   eines   Prädikates 
  1101.                betrachtet.  Alle  Klauseln,  die zu dem jeweiligen 
  1102.                Prädikat   gehören,   werden   auf  den   aktuellen 
  1103.                Ausgabestrom ausgegeben.
  1104.  
  1105. listing 
  1106.                wie  listing/1,  aber  es  werden  alle  Prädikate, 
  1107.                einschließlich   der   vordefinierten    Prädikate, 
  1108.                ausgegeben.  Die Reihenfolge wird durch die 'hash'-
  1109.                Funktion des inneren Interpreters festgelegt
  1110.                und kann nicht geändert werden.
  1111.  
  1112. proc (TERM)
  1113.                versucht,  PAR_1  mit einem F_TERM zu  unifizieren, 
  1114.                der  den  Namen  und  die  Stelligkeit  des  ersten 
  1115.                Prädikates  in der Datenbank besitzt;  soll  'proc' 
  1116.                wiedererfüllt  werden,  wird  das  jeweils  nächste 
  1117.                Prädikat benutzt;  schlägt fehl,  wenn kein solches 
  1118.                Prädikat mehr da ist. Zur Reihenfolge der Prädikate 
  1119.                siehe listing/0.
  1120.  
  1121.      III.2.9 Kontrolle des Programmablaufs
  1122.  
  1123. Bezeichnungen :
  1124.      Wenn  der Aufruf eines Prädikats eine Klausel aktiviert,  die 
  1125.      nicht  die letzte ihres Prädikats ist,  so wird dieser Kausel 
  1126.      ein  Zeiger in die Datenbank zugeordnet.  Dieser Zeiger  wird 
  1127.      verwendet,  wenn  das  aufgerufene Ziel wiedererfüllt  werden 
  1128.      muß.
  1129.      Die direkten Nachkommen eines Aufrufes A sind die Aufrufe  in 
  1130.      der  durch A aktivierten Klausel.  Der direkte Vorfahr von  A 
  1131.      ist  der  Aufruf,  der  die  Klausel  aktivierte,  in  der  A 
  1132.      vorkommt.  Ein Vorfahr von A ist der direkte Vorfahr oder ein 
  1133.      Vorfahr  des  direkten Vorfahrs;  ein Nachkomme von A ist  ein 
  1134.      direkter Nachkomme oder einer von dessen Nachkommen.
  1135.  
  1136. !              ('cut', manchmal auch 'slash')
  1137.                wird erfüllt,  nachdem der nächste Vorfahr gefunden 
  1138.                wurde,  der nicht call/1,  tag/1, ,/2 oder ;/2 ist. 
  1139.                Alle  Datenbankzeiger,  die zu diesem Vorfahren und 
  1140.                allen seinen Nachkommen gehören, werden entfernt.
  1141.  
  1142. repeat 
  1143.                wird  erfüllt,  und kann beliebig oft wiedererfüllt 
  1144.                werden.
  1145.  
  1146. call (AUFRUF)
  1147.                verhält sich so,  als ob PAR_1 anstelle des Aufrufs 
  1148.                von 'call' stünde; allerdings wird ein fehlerhafter 
  1149.                Parameter  bei  Verwendung  von  'call'  erst   zur 
  1150.                Laufzeit   des   Programms  erkannt.   Im   äußeren 
  1151.                Interpreter  kann  eine  Variable  anstelle   eines 
  1152.                Prädikates  als Aufruf in einer Klausel  vorkommen; 
  1153.                ein   solcher  Variablenaufruf  wird  vom   äußeren 
  1154.                Interpreter in einen Aufruf von 'call' umgewandelt.
  1155.  
  1156. tag (AUFRUF)
  1157.                eine andere Form von call(AUFRUF); auf einen Aufruf 
  1158.                von  'tag'  kann  mit  den  Prädikaten   'tagfail', 
  1159.                'tagexit',   'tagcut'  und  'ancestor'  zugegriffen 
  1160.                werden.   PAR_1  heißt  markierter  Vorfahr  seiner 
  1161.                Nachkommen.
  1162.                Ein  Aufruf von 'tag' wird von 'tagfail'  etc.  nur 
  1163.                dann  erkannt,  wenn  er explizit in einer  Klausel 
  1164.                steht; z.B. wird call(tag(A)) nicht erkannt.
  1165.  
  1166. ancestor (TERM)
  1167.                sucht  nach dem nächsten markierten Vorfahren,  der 
  1168.                mit  PAR_1  unifiziert  werden  kann;  wird  keiner 
  1169.                gefunden,  so  schlägt  'ancestor' fehl,  ansonsten 
  1170.                werden   der  Vorfahr  und  PAR_1  unifiziert   und 
  1171.                'ancestor' erfüllt.
  1172.  
  1173.  
  1174. tagcut (TERM)
  1175.                wie 'ancestor', aber bei Erfolg werden sämtliche zu 
  1176.                dem  gefundenen  Vorfahren  und  seinen  Nachkommen 
  1177.                gehörenden Datenbankzeiger entfernt.
  1178.  
  1179. tagfail (TERM)
  1180.                sucht  nach dem nächsten mit  PAR_1  unifizierbaren 
  1181.                markierten  Vorfahren;  schlägt fehl,  falls keiner 
  1182.                gefunden   wird.   Wird   ein  markierter   Vorfahr 
  1183.                gefunden, so schlägt dieser sofort fehl.
  1184.  
  1185. tagexit (TERM)
  1186.                sucht  nach dem nächsten mit  PAR_1  unifizierbaren 
  1187.                markierten  Vorfahren;  schlägt fehl,  falls keiner 
  1188.                gefunden   wird.   Wird   ein  markierter   Vorfahr 
  1189.                gefunden,  so  wird  er  mit PAR_1  unifiziert  und 
  1190.                sofort erfüllt (d.h.  der Aufruf nach tag(...) wird 
  1191.                als nächstes betrachtet).
  1192.  
  1193. halt (ATOM)
  1194.                gibt ATOM aus und beendet den inneren Interpreter.
  1195.  
  1196. stop 
  1197.                beendet die Hauptschleife des äußeren Interpreters; 
  1198.                im  Normalfall wird 'halt' aufgerufen und auch  der 
  1199.                innere Interpreter beendet.  Ausnahmen sind möglich 
  1200.                (z.B. im Editor).
  1201.  
  1202. sysload (DATEINAME)
  1203.                beendet  den äußeren Interpreter und  schaltet  den 
  1204.                aktuellen Eingabestrom auf die angegebene Datei um. 
  1205.                Diese  Datei sollte ein Programm in der Syntax  des 
  1206.                inneren  Interpreters  enthalten  (siehe   Anhang). 
  1207.                Nach   einem   'seen',   bzw.   bei  Erreichen  des 
  1208.                Dateiendes,  wird  der  äußere  Interpreter  wieder 
  1209.                gestartet.
  1210.  
  1211.  
  1212.      III.2.10 Hilfsmittel zum Testen von Programmen
  1213.  
  1214. In  der  ST-Version von TOY Prolog gibt es  die  Möglichkeit,  den 
  1215. Ablauf   eines  Programms  durch  Drücken  der  Tastenkombination
  1216.  
  1217.      'Shift' 'Alternate' 'Help'
  1218.  
  1219. zu unterbrechen. Das momentane Ziel wird in der Form
  1220.  
  1221.      INTR: .......
  1222.  
  1223. ausgegeben,   und   der  Benutzer  erhält  die  Möglichkeit,   den 
  1224. Programmablauf  zu  verändern.  Dazu  kann  er  folgende  Optionen 
  1225. wählen:
  1226. A    (Abort)        Das   gesamte   zu   erfüllende   Ziel    wird 
  1227.                     abgebrochen   (einschließlich   des    äußeren 
  1228.                     Interpreters).
  1229. B    (Backtrace)    Die  Vorfahren  des momentanen  Zieles  werden 
  1230.                     angezeigt.
  1231. C    (Continue)     Das momentane Ziel wird bearbeitet.
  1232. D    (Debug ON/OFF) Der  Testmodus  wird ein-  oder  ausgeschaltet 
  1233.                     (siehe 'debug').
  1234. F    (Fail)         Das momentane Ziel schlägt fehl.
  1235. S    (Step ON/OFF)  Der   Einzelschrittmodus   wird   ein-    oder 
  1236.                     ausgeschaltet;  ist er eingeschaltet,  so wird 
  1237.                     das Programm vor der Bearbeitung des  nächsten 
  1238.                     Zieles von selbst wieder unterbrochen.
  1239.  
  1240. Es  existieren  außerdem einige Prädikate,  die  den  Programmtest 
  1241. erleichtern sollen:
  1242.  
  1243. interrupt 
  1244.                untebricht   den  Programmablauf  (als  hätte   der 
  1245.                Benutzer die Taste 'Help' gedrückt).
  1246.  
  1247. debug 
  1248.                schaltet den Testmodus ein. Im Testmodus wird jedes 
  1249.                zu   bearbeitende   Ziel  mit   einer   Information 
  1250.                ausgegeben, die anzeigt, ob das Ziel
  1251.                - das erste Mal aufgerufen wird     (CALL: ...)
  1252.                - wiedererfüllt werden soll         (REDO: ...)
  1253.                - erfolgreich beendet wird          (EXIT: ...)
  1254.                - oder fehlschlägt                  (FAIL: ...).
  1255.  
  1256. nodebug 
  1257.                schaltet den Testmodus aus.
  1258.  
  1259.  
  1260. nonexistent 
  1261.                schaltet   die   Überwachung   der   Aufrufe    von 
  1262.                undefinierten  Prädikaten ein.  Nach  'nonexistent' 
  1263.                wird  beim  Aufruf eines  undefinierten  Prädikates 
  1264.                eine Meldung ausgegeben.
  1265.  
  1266. nononexistent 
  1267.                schaltet diese Meldungen wieder aus.
  1268.  
  1269. Die folgenden beiden Prädikate schalten den Testmodus selektiv für 
  1270. bestimmte Aufrufe ein:
  1271.  
  1272. spy (NAME, INTEGER)
  1273.                PAR_2  darf nicht negativ sein;  der Testmodus wird 
  1274.                für  das  Prädikat  mit dem  Namen  PAR_1  und  der 
  1275.                Stelligkeit PAR_2 eingeschaltet.
  1276.  
  1277. spy (NAME, VAR)
  1278.                dito, aber für alle Prädikate mit diesem Namen; die 
  1279.                Variable wird nicht instantiiert.
  1280.  
  1281. spy (VAR, INTEGER)
  1282.                dito,   aber   für  alle  Prädikate  mit  gegebener 
  1283.                Stelligkeit.
  1284.  
  1285. spy (VAR, VAR)
  1286.                dito,  aber für alle Prädikate.  Der Effekt ist der 
  1287.                gleiche  wie  bei  'debug',  kann  aber  nicht  mit 
  1288.                'nodebug'  wieder abgeschaltet werden (!).  Da  die 
  1289.                Variablen  nicht  instantiiert  werden,   kann  man 
  1290.                zweimal dieselbe Variable verwenden.
  1291.  
  1292. nospy (PAR1, PAR2)
  1293.                schaltet  den  Testmodus selektiv wieder  ab.  Alle 
  1294.                Aufrufmuster von 'spy' können in der gleichen Weise 
  1295.                wie  dort  verwendet werden.  'nospy' kann den  mit 
  1296.                'debug' eingeschalteten allgemeinen Testmodus nicht 
  1297.                ausschalten.
  1298.  
  1299. spied (NAME, INTEGER)
  1300.                überprüft,  ob  der  selektive  Testmodus  für  das 
  1301.                Prädikat  mit  Namen PAR_1  und  Stelligkeit  PAR_2 
  1302.                eingeschaltet ist.
  1303.  
  1304.  
  1305.      III.2.11 Verarbeitung von grammatikalischen Regeln
  1306.  
  1307. phrase (AUFRUF, TERM)
  1308.                behandelt  PAR_1 als nicht-terminales Symbol  einer 
  1309.                grammatikalischen    Regel   und   veranlaßt    die 
  1310.                Verarbeitung von PAR_2, wobei PAR_1 als Startsymbol 
  1311.                verwendet wird.
  1312.  
  1313.  
  1314.      III.2.12 Verschiedene Funktionen
  1315.  
  1316. length (F_TERM, TERM)
  1317.                PAR_1  muß  eine 'geschlossene' Liste  sein,  deren 
  1318.                Länge  berechnet  wird.   Es  wird  versucht,   das 
  1319.                Ergebnis mit PAR_2 zu unifizieren.
  1320.  
  1321. isclosedlist (TERM)
  1322.                überprüft, ob PAR_1 eine 'geschlossene' Liste ist.
  1323.  
  1324. numbervars (TERM)
  1325.                instantiiert die Variablen, die in PAR_1 vorkommen, 
  1326.                mit 'V'(1), 'V'(2), ... . Variablen, die aneinander 
  1327.                gebunden   sind,   werden  mit  dem  selben  'V'(n) 
  1328.                instantiiert.
  1329.  
  1330. member (TERM, TERM)
  1331.                überprüft,  ob  PAR_1  ein Element der Liste  PAR_2 
  1332.                ist. Falls PAR_2 eine 'offene' Liste ist, die PAR_1 
  1333.                nicht  enthält,  so wird 'member' erfüllt,  nachdem 
  1334.                die Liste um PAR_1 erweitert wurde.
  1335.  
  1336. bagof (TERM, AUFRUF, TERM)
  1337.                versucht,  PAR_3  mit  einer Liste der für PAR_1  - 
  1338.                nach  allen  möglichen  Berechnungen  von  PAR_2  - 
  1339.                ermittelten Instantiierungen zu unifizieren.
  1340.  
  1341. status 
  1342.                gibt    eine   Übersicht   über    die    momentane 
  1343.                Speicherbelegung.
  1344.  
  1345. Die folgenden Prädikate benutzen die Uhr des ATARI ST:
  1346.  
  1347. date (VARINT, VARINT, VARINT)
  1348.                versucht,  PAR_1,  PAR_2  und  PAR_3 mit Zahlen  zu 
  1349.                unifizieren, die das Datum in der Form "Tag, Monat, 
  1350.                Jahr" angeben.
  1351.  
  1352. set_date (INTEGER, INTEGER, INTEGER)
  1353.                setzt das Datum fest :  Par_1 - Tag, PAR_2 - Monat, 
  1354.                PAR_3 - Jahr.
  1355.  
  1356. time (VARINT, VARINT, VARINT)
  1357.                versucht,  PAR_1,  PAR_2  und  PAR_3 mit Zahlen  zu 
  1358.                unifizieren, die die Tageszeit in der Form "Stunde, 
  1359.                Minute, Sekunde" angeben.
  1360.  
  1361. set_time (INTEGER, INTEGER, INTEGER)
  1362.                stellt die Uhr (PAR_1 Stunde,  PAR_2 Minute,  PAR_3 
  1363.                Sekunde).
  1364.  
  1365. 'time' und 'set_time' arbeiten mit Einheiten von 2 Sekunden.
  1366.  
  1367.  
  1368. translate (DATEINAME, DATEINAME)
  1369.                schaltet die Eingabe auf PAR_1 und die Ausgabe  auf 
  1370.                PAR_2  um  und  übersetzt das  von  PAR_1  gelesene 
  1371.                Programm  in die Syntax des  inneren  Interpreters. 
  1372.                Das  Ergebnis  ist eine Datei,  die  mit  'sysload' 
  1373.                eingelesen werden kann.
  1374.                Siehe   auch   die   Abschnitte   über   'consult', 
  1375.                'sysload', sowie den Anhang.
  1376.  
  1377.      III.3 Die GEM-Funktionen
  1378.  
  1379. TOY  Prolog  ST  kann auf einige der Funktionen von  VDI  und  AES 
  1380. zugreifen.   Genaueres   zu  diesen  Funktionen  kann  hier  nicht 
  1381. angegeben werden.
  1382.  
  1383. In  den folgenden Kurzbeschreibungen sind alle  Parameter,  soweit 
  1384. nicht anders angegeben, INTEGER-Zahlen.
  1385.  
  1386.      III.3.1 Kontrollfunktionen
  1387.  
  1388. grf_clip (Flag, X1, Y1, X2, Y2)
  1389.                Falls  Flag = 0,  wird das Clipping  ausgeschaltet, 
  1390.                sonst  eingeschaltet;  (X1,  Y1)  und (X2,  Y2) sind 
  1391.                diagonal  gegenüberliegende  Ecken  des   Clipping-
  1392.                Rechtecks.
  1393.  
  1394. grf_wrmode (Modus)
  1395.                Stellt den Schreibmodus ein :
  1396.                0 - Replace - Modus
  1397.                1 - Transparent-Modus
  1398.                2 - XOR - Modus
  1399.                3 - Reverse-Transparent-Modus
  1400.  
  1401. grf_colour (Index, Rot, Grün Blau)
  1402.                Setzt die Farbzusammensetzung für die Farbe mit der 
  1403.                Nummer  Index  fest.  Rot,  Grün und Blau liegen im 
  1404.                Bereich 1 - 1000.
  1405.  
  1406. grf_mode 
  1407.                Schaltet den Grafikmodus ein.
  1408.  
  1409. txt_mode 
  1410.                Schaltet den Textmodus ein.
  1411.  
  1412.  
  1413.      III.3.2 Graphische Ausgabe
  1414.  
  1415. grf_pline (Koordinatenliste)
  1416.                PAR_1  muß eine Liste mit einer geraden Anzahl  von 
  1417.                INTEGERs  sein.  Je zwei der Listenelemente  werden 
  1418.                als Koordinaten betrachtet;  es wird ein Polygonzug 
  1419.                (Polyline) gezeichnet.
  1420.  
  1421. grf_pmarker (Koordinatenliste)
  1422.                Es wird eine Anzahl von Markierungen mit den  durch 
  1423.                PAR_1 angegebenen Koordinaten gezeichnet.
  1424.  
  1425. grf_poly (Koordinatenliste)
  1426.                Es wird ein ausgefülltes Polygon gezeichnet.
  1427.  
  1428. grf_fill (X, Y, Index)
  1429.                Eine  Fläche  wird bis zu  ihrem  Rand  ausgefüllt, 
  1430.                ausgehend   vom  Punkt  (X,   Y).   Index  ist  der 
  1431.                ursprüngliche Farbindex der Fläche.
  1432.  
  1433. grf_box (X1, Y1, X2, Y2)
  1434.                Es  wird  ein  ausgefülltes   Rechteck  gezeichnet; 
  1435.                (X1, Y1) und (X2, Y2) sind gegenüberliegende Ecken.
  1436.  
  1437. grf_bar (X1, Y1, X2, Y2)
  1438.                dito, aber das Rechteck wird umrandet.
  1439.  
  1440. grf_arc (X, Y, R, Alpha, Omega)
  1441.                Ein  Kreisbogen mit Mittelpunkt (X,  Y),  Radius R, 
  1442.                Startwinkel   Alpha   und  Endwinkel   Omega   wird 
  1443.                gezeichnet.
  1444.  
  1445. grf_pie (X, Y, R, Alpha, Omega)
  1446.                dito, aber ausgefüllter Kreissektor.
  1447.  
  1448. grf_circle (X, Y, R)
  1449.                Ein  ausgefüllter Kreis mit Mittelpunkt (X,  Y) und 
  1450.                Radius R wird gezeichnet.
  1451.  
  1452. grf_ellipse (X, Y, Xrad, Yrad)
  1453.                Eine ausgefüllte Ellipse mit Mittelpunkt (X, Y) und 
  1454.                Achsenabschnitten Xrad und Yrad wird gezeichnet.
  1455.  
  1456. grf_rbox (X1, Y1, X2, Y2)
  1457.                Zeichnet   ein  nicht  ausgefülltes  Rechteck   mit 
  1458.                abgerundeten Ecken.
  1459.  
  1460. grf_rfbox (X1, Y1, X2, Y2)
  1461.                Wie 'grf_rbox', aber ausgefülltes Rechteck.
  1462.  
  1463. grf_text (X, Y, Text)
  1464.                Text ist ein NAME,  der an der Position (X,  Y) als 
  1465.                Grafiktext ausgegeben wird.
  1466.  
  1467.      III.3.3 Attribute-Funktionen
  1468.  
  1469. grf_l_colour (Index)
  1470.                Setzt die Linienfarbe fest.
  1471.  
  1472. grf_l_type (Style)
  1473.                Setzt den Linientyp fest :
  1474.                1 : durchgezogen
  1475.                2 - 6 : gestrichelt
  1476.                7 : frei definierbar
  1477.  
  1478. grf_l_udstyle (Pattern)
  1479.                Setzt   den  frei  definierbaren  Linientyp   fest. 
  1480.                Pattern  ist eine INTEGER-Zahl,  deren 16 Bits  das 
  1481.                Muster festlegen.
  1482.  
  1483. grf_l_width (Width)
  1484.                Setzt die Linienbreite fest.
  1485.  
  1486. grf_l_ends (Begin, End)
  1487.                Setzt das Aussehen  von  Linienanfang  (Begin)  und 
  1488.                -ende (End) fest.
  1489.                0 : kantig
  1490.                1 : Pfeil
  1491.                2 : abgerundet
  1492.  
  1493. grf_m_colour (Index)
  1494.                Setzt die Farbe der Markierungen fest.
  1495.  
  1496. grf_m_type (Type)
  1497.                Setzt den Markierungstyp fest.
  1498.                1 : Punkt
  1499.                2 : Kreuz
  1500.                3 : Stern
  1501.                4 : Quadrat
  1502.                5 : Diagonalkreuz
  1503.                6 : Raute
  1504.  
  1505. grf_m_height (Height)
  1506.                Setzt die Markierungsgröße fest.
  1507.  
  1508.  
  1509. grf_t_height (Height)
  1510.                Setzt die Textgröße fest.
  1511.  
  1512. grf_t_point (Point)
  1513.                Setzt die Textgröße in Punkt fest.
  1514.  
  1515. grf_t_rotation (Angle)
  1516.                Setzt  den Winkel fest,  um den die  Textgrundlinie 
  1517.                gedreht wird.
  1518.  
  1519. grf_t_colour (Index)
  1520.                Setzt die Textfarbe fest.
  1521.  
  1522. grf_t_effects (Effects)
  1523.                Setzt  die Texteffekte fest.  Effects entsteht  als 
  1524.                Summe der gewünschten Effekte :
  1525.                1 : Fettdruck
  1526.                2 : Helle Schrift
  1527.                4 : Kursivschrift 
  1528.                8 : Unterstreichung
  1529.                16 : Außenrand der Buchstaben
  1530.  
  1531. grf_t_align (Hor, Vert)
  1532.                Setzt die Textausrichtung fest.
  1533.                Hor : horizontale Ausrichtung -
  1534.                     0 : links
  1535.                     1 : zentriert
  1536.                     2 : rechts
  1537.                Vert : vertikale Ausrichtung -
  1538.                     0 : Grundlinie
  1539.                     1 : Obergrenze Kleinbuchstaben
  1540.                     2 : Obergrenze Zeichen
  1541.                     3 : Untergrenze Zeichenbox
  1542.                     4 : Untergrenze Unterlängen
  1543.                     5 : Obergrenze Zeichenbox
  1544.  
  1545. grf_f_colour (Index)
  1546.                Setzt die Füllfarbe fest.
  1547.  
  1548. grf_f_type (Interior)
  1549.                Setzt den Fülltyp fest :
  1550.                0 : leer
  1551.                1 : voll
  1552.                2 : gemustert
  1553.                3 : schraffiert
  1554.                4 : frei definierbar
  1555.  
  1556. grf_f_style (Style)
  1557.                Setzt für die Fülltypen 2 und 3 den Füllstil fest.
  1558.  
  1559.  
  1560. grf_f_perim (Flag)
  1561.                Schaltet die Umrandung von ausgefüllten Flächen  an 
  1562.                (Flag = 1) oder aus (Flag = 0).
  1563.  
  1564. grf_f_udpat (Pattern)
  1565.                Pattern muß eine Liste mit genau 16  INTEGER-Zahlen 
  1566.                sein.  Die  16  Zahlen  werden als Muster  für  den 
  1567.                Fülltyp 4 verwendet.
  1568.  
  1569.  
  1570.      III.3.4 Funktionen zur Maussteuerung
  1571.  
  1572. grf_mse_hide 
  1573.                Schaltet die Maus (den Grafikcursor) aus.
  1574.  
  1575. grf_mse_show (Flag)
  1576.                Ist  Flag  =  0,  so wird die  Maus  sofort  wieder 
  1577.                eingeschaltet;  ansonsten wird sie erst dann wieder 
  1578.                eingeschaltet,   wenn  'grf_mse_show'  genauso  oft 
  1579.                aufgerufen wurde wie vorher 'grf_mse_hide'.
  1580.  
  1581. grf_mse_form (Form)
  1582.                Schaltet eine vordefinierte Mausform ein.
  1583.                0 : Pfeil
  1584.                1 : 'Cursor'
  1585.                2 : Biene
  1586.                3 : zeigende Hand
  1587.                4 : flache Hand
  1588.                5 : dünnes Kreuz
  1589.                6 : dickes Kreuz
  1590.                7 : Umrißkreuz
  1591.                255 : Bleistift
  1592.  
  1593. grf_mse_form (Xhot, Yhot, Mask, Data, Pattern)
  1594.                Schaltet eine frei definierte Mausform ein :
  1595.                Xhot   und   Yhot   sind   die   Koordinaten    des 
  1596.                Aktionspunktes  innerhalb des  16x16-Rasters,  Mask 
  1597.                und  Data sind die Hinter-  bzw.  Vordergrundfarbe. 
  1598.                Pattern  muß  eine  aus  genau  32   INTEGER-Zahlen 
  1599.                bestehende  Liste sein;  die ersten 16 davon  geben 
  1600.                die Maske,  die letzten 16 die Daten für das Raster 
  1601.                an.
  1602.  
  1603. grf_mse_state (Button, X, Y)
  1604.                Die Parameter müssen Variablen oder  INTEGER-Zahlen 
  1605.                sein;  es wird versucht,  Button mit dem momentanen 
  1606.                Zustand  der  Maustasten  und  X  bzw.  Y  mit  der 
  1607.                momentanen    Position   des    Grafikcursors    zu 
  1608.                unifizieren.
  1609.  
  1610.  
  1611.      III.3.5 Darstellen einer Warnmeldung
  1612.  
  1613. alert (Defbutton, Alert, Exbutton)
  1614.                Alert  muß  ein NAME sein;  die Zeichen des  Namens 
  1615.                werden als Zeichenkette betrachtet.
  1616.                Die  AES-Funktion 'form_alert' wird aufgerufen;  es 
  1617.                wird versucht, den Wert, den sie zurückliefert, mit 
  1618.                Exbutton zu unifizieren.
  1619.                Exbutton  muß eine Integer-Zahl oder eine  Variable 
  1620.                sein.
  1621.  
  1622.  
  1623.      III.4 Namen der Systemfunktionen
  1624.  
  1625. Die  Namen der Systemfunktionen können geändert werden,  indem man 
  1626. die  Beschreibungen  im zweiten Abschnitt der  Systemdatei  ändert 
  1627. (siehe  Anhang).  Dabei  ist  darauf  zu  achten,  daß  weder  die 
  1628. Reihenfolge  noch die Anzahl der Namen geändert wird,  und daß die 
  1629. Stelligkeiten erhalten bleiben.
  1630.  
  1631. Es  empfiehlt  sich,  vor  einer Änderung eine  neue  Version  der 
  1632. Benutzerschnittstelle  herzustellen,  da  nach einer Änderung  die 
  1633. vorherige  Version  wahrscheinlich nicht mehr lauffähig  ist.  Das 
  1634. Gleiche gilt für alle anderen Programme.
  1635.  
  1636. Die Namen der vordefinierten Prädikate können nur geändert werden, 
  1637. indem deren Definition in der Systemdatei,  bzw.  (bei Prädikaten, 
  1638. die  zur  Benutzerschnittstelle  gehören)  im  Quelltext  geändert 
  1639. werden. Auch hierfür gelten die obigen Hinweise.
  1640.  
  1641.  
  1642.      IV. Die Hilfsprogramme von TOY Prolog
  1643.  
  1644.      IV.1 Der Übersetzer für die Benutzerschnittstelle
  1645.  
  1646. Quellcode und Zwischencode : 'BOOTER.TOY'.
  1647.  
  1648. Das  Programm 'BOOTER.TOY' wird benötigt,  um nach Änderungen  der 
  1649. Benutzerschnittstelle   eine   neue   Version   der    Systemdatei 
  1650. herzustellen. Die Benutzerschnittstelle ist nicht im vollständigen 
  1651. Prolog geschrieben,  sondern in einer 'abgemagerten' Version,  die 
  1652. sich  leicht  in die Syntax des  inneren  Interpreters  übersetzen 
  1653. läßt. Der Übersetzer erledigt genau diese Arbeit.
  1654.  
  1655. Benutzung des Übersetzers
  1656.  
  1657. Um eine neue Version der Benutzerschnittstelle zu übersetzen, wird 
  1658. der Übersetzer mit 'sysload' geladen.
  1659. Der Aufruf erfolgt in der Form
  1660.  
  1661.      transl(Eingabedatei, Ausgabedatei).
  1662.  
  1663. also analog zum vordefinierten Prädikat 'translate'.
  1664. Als Zeichen für das Ende der Eingabedatei dient das Zeichen '#';
  1665. falls  es  nicht am Ende der Eingabedatei steht,  muß es von  Hand 
  1666. eingegeben werden.
  1667.  
  1668. Der  Übersetzer  kann Fehlermeldungen produzieren;  dabei gibt  er 
  1669. den  Namen desjenigen Prädikats aus,  das den Fehler entdeckt hat, 
  1670. sowie  das  fehlerhafte Zeichen und den Rest der Eingabe  bis  zum 
  1671. nächsten Punkt.
  1672.  
  1673. Ist   die  Übersetzung  fehlerfrei  verlaufen,   so  enthält   die 
  1674. Ausgabedatei    den   Zwischencode   der   neuen    Version    der 
  1675. Benutzerschnittstelle; dieser Code kann - am besten nach Entfernen 
  1676. der   Kommentare  -  mit  einem  Texteditor  anstelle  des   alten 
  1677. Zwischencodes in die Systemdatei eingefügt werden.  Es ist ratsam, 
  1678. vorher eine Kopie der alten (lauffähigen !)  Benutzerschnittstelle 
  1679. zu  machen,  da es durchaus vorkommen kann,  daß die neue  Version 
  1680. fehlerhaft ist. Beliebte Fehler sind das Verwechseln von Groß- und 
  1681. Kleinschreibung, insbesondere bei Variablennamen wie z.B.
  1682.  
  1683.      NextCh  -  Nextch  -  NextChar - NextChr  etc.
  1684.  
  1685.  
  1686.      IV.2 Der Editor
  1687.  
  1688. Quelltext : 'EDITOR'.
  1689. Zwischencode : 'EDITOR.TOY'.
  1690.  
  1691. Es handelt sich um einen einfachen Editor für Prädikate.
  1692. Er wird mit
  1693.  
  1694.      edit (Name/Stelligkeit).
  1695.  
  1696. aufgerufen.   Der  Editor  zeigt  jeweils  die  momentane  Klausel 
  1697. zusammen  mit ihrer Nummer an;  am Anfang steht er auf Klausel  0, 
  1698. d.h.  vor der ersten Klausel.  Nach jedem Kommando wird die (neue) 
  1699. Klausel angezeigt.
  1700.  
  1701.  
  1702. Der Editor versteht folgende Kommandos :
  1703.  
  1704. e Name/Stelligkeit  ruft eine neue Inkarnation des Editors auf. Es 
  1705.                     kann ein anderes Prädikat bearbeitet werden.
  1706. x                   verläßt die momentane Inkarnation des Editors.
  1707. +                   zeigt  die nächste Klausel an,  falls es  eine 
  1708.                     gibt.
  1709. <CR>                (Leerzeile) wie +
  1710. -                   zeigt die vorherige Klausel an (falls es  eine 
  1711.                     gibt).
  1712. t                   geht zur Klausel 0.
  1713. b                   geht zur letzten Klausel.
  1714. l                   listet das gesamte Prädikat auf.
  1715. d                   löscht  die  momentane Klausel  und  geht  zur 
  1716.                     nächsten (oder zur letzten,  falls die  vorher 
  1717.                     letzte gelöscht wurde).
  1718. i                   In  den folgenden Zeilen eingegebene  Klauseln 
  1719.                     werden nach der momentanen Klausel  eingefügt; 
  1720.                     'end.' beendet den Einfügemodus.
  1721. f Dateiname         Wie  'i',  aber  die Klauseln werden  aus  der 
  1722.                     angegebenen Datei gelesen.
  1723. p                   ruft eine neue Inkarnation von Prolog auf (!). 
  1724.                     Wenn  'stop' ausgeführt wird,  wird im  Editor 
  1725.                     fortgefahren.     In    der    verschachtelten 
  1726.                     Inkarnation von Prolog sollte 'sysload'  nicht 
  1727.                     benutzt werden.
  1728.  
  1729. Ein  eingegebenes  Kommando muß nach dem letzten  Zeichen  beendet 
  1730. werden.  Wo Leerzeichen angegeben sind, muß genau eines eingegeben 
  1731. werden.
  1732.  
  1733.  
  1734.      IV.3 Der Programmanalysator
  1735.  
  1736. Quelltext : 'CALLTREE'
  1737. Zwischencode : 'CALLTREE.TOY'
  1738.  
  1739. Der Programmstrukturanalysator wird mit
  1740.  
  1741.      calltree (Name/Stelligkeit).
  1742.  
  1743. aufgerufen,  um  das  Prädikat mit dem angegebenen Namen  und  der 
  1744. angegebenen Stelligkeit zu analysieren.  Er erzeugt eine Liste der 
  1745. Aufrufe,  die während des Programmablaufs als Teilziele betrachtet 
  1746. werden.
  1747. Teilziele werden in der Zeile,  in der sie erstmals vorkommen, mit 
  1748. einer Nummer versehen, auf die bei nochmaligem Auftreten verwiesen 
  1749. wird.
  1750. Die Verschachtelungstiefe wird durch verschieden weite  Einrückung 
  1751. der Zeilen angezeigt.
  1752.  
  1753. Der    Programmstrukturanalysator   sollte   nicht   mit    'Help' 
  1754. unterbrochen werden und nicht im Testmodus laufen,  da während des 
  1755. Programmablaufs  in den meisten Fällen  zyklische  Datenstrukturen 
  1756. erzeugt werden.  Solche Datenstrukturen entstehen z.B.  auch, wenn 
  1757. die Terme
  1758.  
  1759.      X              und            f(X)
  1760.  
  1761. unifiziert werden. Wie man sieht, enthält TOY Prolog keinen 'occur 
  1762. check' : Die Terme werden ohne weiteres unifiziert. Jeder Versuch, 
  1763. den enstehenden Term auszugeben,  führt allerdings in eine endlose 
  1764. Ausgabeschleife,  die  zum  Absturz  des  Interpreters  führt.  Im 
  1765. Programmanalysator   werden   solche  Strukturen   erzeugt,   wenn 
  1766. rekursive Prädikate analysiert werden.
  1767.  
  1768.  
  1769.      V. Die Demonstrationsprogramme
  1770.  
  1771.      V.1 ALPHA
  1772.  
  1773. Quellcode : 'ALPHA'
  1774.  
  1775. ALPHA  ist  ein  Beispiel für  die  Entwicklung  von  interaktiven 
  1776. Programmen. Nach dem Einlesen wird es mit 'go.' aufgerufen.
  1777. ALPHA   versteht   drei  Formen  von   Sätzen.   Nachstehend   ein 
  1778. beispielhafter Dialog (Ausgaben unterstrichen) :
  1779.  
  1780. go.
  1781. (...)
  1782. John is a man.
  1783. OK
  1784. A man is a person.
  1785. OK
  1786. Is John a person ?
  1787. Yes.
  1788. Is Mary a person ?
  1789. I don't know !
  1790. Bye.
  1791. (...)
  1792.  
  1793. ALPHA liest die Sätze mit einem Prädikat ein, das einzelne Zeichen 
  1794. liest und sie zu Worten zusammenfaßt.  Die dabei entstehende Liste 
  1795. von  Worten  wird  danach  mit  Hilfe  von  grammatischen   Regeln 
  1796. untersucht   und  in  Prolog-Anweisungen  übersetzt.   Die  obigen 
  1797. Eingaben führen z.B.  dazu, daß folgende Klauseln in die Datenbank 
  1798. übernommen werden :
  1799.  
  1800. man(john).
  1801. person(X) :- man(X).
  1802.  
  1803.      V.2 TOYSEQUEL (© 1983 Kluzniak & Szpakowicz)
  1804.  
  1805. Quelltext : 'TOYSEQ'
  1806.  
  1807. TOYSEQUEL  ist ein erheblich größeres Beispiel für  die  Benutzung 
  1808. von    grammatikalischen   Regeln   zur   Implementierung    einer 
  1809. Kommandosprache.  TOYSEQUEL stellt eine relationale Datenbank dar. 
  1810. Eine genaue Beschreibung der Kommandos findet sich in "Prolog  for 
  1811. Programmers".
  1812.  
  1813.  
  1814. Hier  kann  nur auf die Grundlagen eingegangen  werden,  und  zwar 
  1815. anhand von Beispielen :
  1816.  
  1817. Aufruf von TOYSEQUEL
  1818.  
  1819. :- toysequel.
  1820.  
  1821. Es werden einige Relationen erzeugt
  1822.  
  1823. create ANG < string name, integer gehalt, integer abtnr >.
  1824. create ABT < integer abtnr, string manager >.
  1825. create Aufsichtsrat < string name, integer funktion >.
  1826.  
  1827. Einfügen von Datentupeln
  1828.  
  1829. into ANG insert <"Schmidt", 1000, 1>, <"Meier", 1200, 2>,
  1830.                 <"Müller", 600, 1>.
  1831. into ABT insert <1, "Raffke">, <2, "Hoffmann">.
  1832.  
  1833. Anfragen über Relationen
  1834.  
  1835. relations.
  1836. Aufsichtsrat 
  1837. ABT 
  1838. ANG 
  1839.  
  1840. relation ANG.
  1841. string name 
  1842. integer gehalt 
  1843. integer abtnr 
  1844.  
  1845. Betrachten von Tupeln mit bestimmten Eigenschaften
  1846.  
  1847. select from ANG tuples <name, gehalt> where abtnr = 1.
  1848. Schmidt 1000 
  1849. Müller 600 
  1850.  
  1851. Einfügen von ausgewählten Tupeln
  1852.  
  1853. into ANG insert select from ABT tuples <manager, 1000, abtnr>.
  1854.  
  1855. Verändern von Tupeln
  1856.  
  1857. update ANG so that gehalt = 1200 where name = "Raffke".
  1858.  
  1859. from ANG delete tuples where name = "Hoffmann".
  1860.  
  1861.  
  1862. Die  Möglichkeiten des Programms gehen noch erheblich  weiter;  es 
  1863. gibt   verschiedene   Möglichkeiten   des   Vergleichs,   beliebig 
  1864. komplizierte  arithmetische Ausdrücke;  kommt ein Name in mehreren 
  1865. Relationen vor,  so kann er durch Qualifizieren eindeutig bestimmt 
  1866. werden;  eine  Relation,  die in einem Kommando mehrfach gebraucht 
  1867. wird, kann 'Alias'-Namen erhalten etc.
  1868.  
  1869. Noch drei wichtige Kommandos :
  1870.  
  1871. dump to DATEINAME.
  1872. speichert die Relationen in der angegebenen Datei.
  1873.  
  1874. load from DATEINAME.
  1875. lädt eine Datei.
  1876.  
  1877. stop.
  1878. kehrt zurück zu TOY Prolog.
  1879.  
  1880.  
  1881.      V.3 Tic Tac Toe
  1882.  
  1883. Quelltext : 'TICTAC.TOE'
  1884. Zwischencode : 'TICTAC.TOY'
  1885.  
  1886. Tic  Tac  Toe  soll die Verwendung der  Grafikfunktionen  von  TOY 
  1887. Prolog ST anhand eines Bei - Spiels demonstrieren.
  1888.  
  1889. Der Aufruf erfolgt durch
  1890.  
  1891. tictactoe.
  1892.  
  1893. Der  Benutzer  spielt gegen den Computer (das Programm  ist  etwas 
  1894. langweilig, da der Computer nicht verlieren kann).
  1895. Ein Zug wird ausgeführt, indem der Benutzer mit dem Mauszeiger auf 
  1896. ein  freies Feld des Spielbrettes zeigt und den  linken  Mausknopf 
  1897. drückt.
  1898. Wird  der Mausknopf gedrückt,  während der Zeiger auf den  'STOP'-
  1899. Knopf zeigt, so wird das Programm beendet.
  1900.  
  1901.  
  1902.  
  1903. Ende der allgemeinen Dokumemtation zu TOY Prolog ST, Version 3.
  1904.  
  1905.  
  1906.